﻿using CCWin;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using 群智感知激励系统服务端底层;

namespace 群智感知激励系统服务端
{
    public partial class Form1 : CCSkinMain
    {
        private 用户 已选择用户;
        private int 用户日志id = 1;
        private int 用户序号 = 0;

        public Form1()
        {
            InitializeComponent();
            全局.stopwatch = new Stopwatch();
            全局.stopwatch.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            TCP传输层.启动();
            任务.产生任务(任务.任务总数);
            //虚拟货币.产生虚拟货币(20);
            任务列表lv.Items.Clear();
            任务列表lv.BeginUpdate();
            foreach (任务 i in 任务.任务列表)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Text = i.任务id.ToString();
                lvi.SubItems.Add(i.类型.ToString());
                lvi.SubItems.Add(i.匿名度.ToString("0.00"));
                lvi.SubItems.Add(i.激励金额.ToString());
                lvi.SubItems.Add(i.任务完成情况.ToString("0") + "%");
                任务列表lv.Items.Add(lvi);
            }
            任务列表lv.EndUpdate();
            chart1.ChartAreas[0].AxisX.Minimum = 0;
            chart1.ChartAreas[0].AxisX.Maximum = 30;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                lock (用户.添加列表)
                {
                    if (用户.添加列表.Count != 0)
                    {
                        用户列表lv.BeginUpdate();
                        foreach (用户 i in 用户.添加列表)
                        {
                            ListViewItem lvi = new ListViewItem();
                            lvi.Text = (用户序号++).ToString();
                            lvi.SubItems.Add(i.临时id.ToString());
                            TimeSpan ts = new TimeSpan(0, 0, (int)i.在线时间);
                            lvi.SubItems.Add(ts.TotalHours.ToString("00") + ":" + ts.Minutes.ToString("00") + ":" + ts.Seconds.ToString("00"));
                            lvi.SubItems.Add((i.目标匿名度).ToString("0.00"));
                            lvi.SubItems.Add(((double)i.联合匿名度() / 100).ToString("0.00"));
                            用户列表lv.Items.Add(lvi);
                            用户.用户列表.Add(i);
                            if (用户.添加列表.Count == 0)
                                break;
                        }
                        用户列表lv.EndUpdate();
                        用户.添加列表.Clear();
                    }
                }

                lock (用户.用户列表)
                {
                    if (用户.用户列表.Count != 0)
                    {
                        用户列表lv.BeginUpdate();
                        foreach (用户 i in 用户.用户列表)
                        {
                            try
                            {
                                TimeSpan ts = new TimeSpan(0, 0, (int)i.在线时间);
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[2].Text = ts.TotalHours.ToString("00") + ":" + ts.Minutes.ToString("00") + ":" + ts.Seconds.ToString("00");
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[3].Text = (i.目标匿名度).ToString("0.00");
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[4].Text = (i.联合匿名度() / 100).ToString("0.00");
                            }
                            catch
                            {
                                用户.删除列表.Add(i);
                            }
                        }
                        用户列表lv.EndUpdate();
                    }
                }
            }
            catch { }
            更新系统信息();
        }

        private void 更新用户信息(用户 用户)
        {
            lock (用户)
            {
                double x = 用户.联合匿名度();
                if (x < 0)
                    x = 0;
                else if (x > 100)
                    x = 100;
                chart1.Series[0].Points.AddXY((double)全局.stopwatch.ElapsedMilliseconds / 1000, x);
            }
        }

        private void 更新系统信息()
        {
            已完成任务lb.Text = "已完成任务：" + 任务.已完成任务.ToString();
            任务总数lb.Text = "任务总数：" + 任务.任务列表.Count.ToString();
            总体任务进度条.Maximum = 任务.任务列表.Count;
            总体任务进度条.Value = 任务.已完成任务;
            用户数量lb.Text = "用户数量：" + 用户.历史用户.Count;
            if (!全局.匿名度接管)
                匿名度接管状态lb.Text = "动态匿名度";
            else
                匿名度接管状态lb.Text = "静态匿名度：" + 全局.匿名度接管值;
        }

        private void 用户列表lv_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (用户列表lv.SelectedItems.Count > 0)
                {
                    用户日志id = 1;
                    用户操作列表lv.Items.Clear();
                    //chart1.Series.Clear();
                    lock (用户.历史用户)
                        已选择用户 = 用户.历史用户.Find(i => i.临时id.ToString() == 用户列表lv.SelectedItems[0].SubItems[1].Text);

                    if (已选择用户 != null)
                    {
                        lock (已选择用户)
                        {
                            chart1.Series[0].Points.DataBindXY(已选择用户.匿名度图表X, 已选择用户.匿名度图表Y);
                            //chart1.Series[0].Points.DataBindXY(已选择用户.匿名度图表X, 已选择用户.匿名度图表Y);
                            chart1.Series[0].Name = 已选择用户.临时id.ToString() + "的匿名度";
                            操作日志计时器.Enabled = true;
                            //Series s = new Series(用户.临时id.ToString() + "的信息匿名度");
                        }
                    }

                }
            }
            catch { }
        }

        private void skinButton2_Click(object sender, EventArgs e)
        {
            任务列表Form f = new 任务列表Form();
            f.Show();
        }

        private void skinButton3_Click(object sender, EventArgs e)
        {
            虚拟货币窗口 f = new 虚拟货币窗口();
            f.Show();
        }

        private void 用户列表lv_DoubleClick(object sender, EventArgs e)
        {
            //已选择用户 = 用户.用户列表.Find(i => i.临时id.ToString() == 用户列表lv.SelectedItems[0].Text);
            if (已选择用户 != null)
            {
                lock (已选择用户)
                {
                    用户日志窗口 f = new 用户日志窗口(已选择用户);
                    f.Show();
                }
            }
        }

        private void 用户操作列表lv_DoubleClick(object sender, EventArgs e)
        {
            用户操作 用户操作 = null;
            if (已选择用户 != null)
            {
                lock (已选择用户)
                    用户操作 = 已选择用户.操作日志[用户操作列表lv.SelectedItems[0].Index];
            }
            if (用户操作 != null)
            {
                用户历史信息 f = new 用户历史信息(用户操作);
                f.Show();
            }
        }

        private void skinButton4_Click(object sender, EventArgs e)
        {
            系统设置窗口 f = new 系统设置窗口();
            f.ShowDialog();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            try
            {
                if (用户列表lv.SelectedItems.Count > 0)
                {
                    lock (用户.用户列表)
                        已选择用户 = 用户.历史用户.Find(i => i.临时id.ToString() == 用户列表lv.SelectedItems[0].SubItems[1].Text);
                    if (已选择用户 != null)
                        更新用户信息(已选择用户);

                }
                if (全局.stopwatch.ElapsedMilliseconds / 1000 > 30)
                {
                    chart1.ChartAreas[0].AxisX.Minimum = 全局.stopwatch.ElapsedMilliseconds / 1000 - 30;
                    chart1.ChartAreas[0].AxisX.Maximum = 全局.stopwatch.ElapsedMilliseconds / 1000;
                }
                else
                {
                    chart1.ChartAreas[0].AxisX.Minimum = 0;
                    chart1.ChartAreas[0].AxisX.Maximum = 30;
                }
            }
            catch { }
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            try
            {

                if (已选择用户 == null)
                {
                    操作日志计时器.Enabled = false;
                    return;
                }
                else
                    lock (已选择用户)
                        lock (已选择用户.操作日志)
                        {
                            if (用户操作列表lv.Items.Count == 0)
                            {
                                用户操作列表lv.BeginUpdate();
                                foreach (用户操作 i in 已选择用户.操作日志)
                                {
                                    ListViewItem lvi = new ListViewItem();
                                    lvi.Text = 用户日志id.ToString();
                                    lvi.SubItems.Add(i.操作信息);
                                    lvi.SubItems.Add(i.时间戳);
                                    用户操作列表lv.Items.Add(lvi);
                                    用户日志id++;
                                }
                                用户操作列表lv.EndUpdate();
                            }
                            int 记录差 = 已选择用户.操作日志.Count - 用户操作列表lv.Items.Count;
                            if (记录差 > 0)
                            {
                                用户操作列表lv.BeginUpdate();
                                for (int i = 用户操作列表lv.Items.Count; i < 已选择用户.操作日志.Count; i++)
                                {
                                    ListViewItem lvi = new ListViewItem();
                                    lvi.Text = 用户日志id.ToString();
                                    lvi.SubItems.Add(已选择用户.操作日志[i].操作信息);
                                    lvi.SubItems.Add(已选择用户.操作日志[i].时间戳);
                                    用户操作列表lv.Items.Add(lvi);
                                    用户日志id++;
                                }
                                用户操作列表lv.EndUpdate();
                            }
                        }

            }
            catch { }
        }

        private void 任务列表计时器_Tick(object sender, EventArgs e)
        {
            任务列表lv.BeginUpdate();
            lock (任务.任务列表)
            {
                try
                {
                    if (任务.任务列表.Count > 任务列表lv.Items.Count)
                    {
                        任务列表lv.Items.Clear();
                        foreach (任务 i in 任务.任务列表)
                        {
                            ListViewItem lvi = new ListViewItem();
                            lvi.Text = i.任务id.ToString();
                            lvi.SubItems.Add(i.类型.ToString());
                            lvi.SubItems.Add((i.匿名度).ToString("0.00"));
                            lvi.SubItems.Add(i.激励金额.ToString());
                            lvi.SubItems.Add(i.任务完成情况.ToString("0") + "%");
                            任务列表lv.Items.Add(lvi);
                        }
                        任务列表lv.EndUpdate();
                        return;
                    }
                    if (任务.任务列表.Count != 0)
                    {
                        foreach (任务 i in 任务.任务列表)
                        {
                            ListViewItem lvi = 任务列表lv.FindItemWithText(i.任务id.ToString());
                            if (lvi != null)
                                lvi.SubItems[4].Text = i.任务完成情况.ToString("0") + "%";
                        }
                    }
                    /*if (任务.删除列表.Count != 0)
                    {
                        foreach (任务 i in 任务.删除列表)
                        {
                            任务列表lv.Items.Remove(任务列表lv.FindItemWithText(i.任务id.ToString()));
                        }
                    }*/
                }
                catch { }
            }
            任务列表lv.EndUpdate();
        }

        private void skinButton5_Click(object sender, EventArgs e)
        {
            系统日志窗口 f = new 系统日志窗口();
            f.Show();
        }

        private void 用户操作列表lv_Click(object sender, EventArgs e)
        {
        }

        private void 用户列表lv_Click(object sender, EventArgs e)
        {
        }

        private void 删除用户_Tick(object sender, EventArgs e)
        {
            try
            {
                lock (用户.删除列表)
                {
                    if (用户.删除列表.Count != 0)
                    {
                        foreach (用户 i in 用户.删除列表)
                        {
                            foreach (ListViewItem lvi in 用户列表lv.Items)  //选中项遍历
                            {
                                if (lvi.Text == i.临时id.ToString())
                                    用户列表lv.Items.Remove(lvi); // 按索引移除
                            }
                            用户.用户列表.Remove(i);
                        }
                        用户.删除列表.Clear();
                    }
                }
            }
            catch { }
        }

        private void 用户列表_Tick(object sender, EventArgs e)
        {
            try
            {
                lock (用户.用户列表)
                {
                    if (用户.用户列表.Count != 0)
                    {
                        用户列表lv.BeginUpdate();
                        foreach (用户 i in 用户.用户列表)
                        {
                            try
                            {
                                TimeSpan ts = new TimeSpan(0, 0, (int)i.在线时间);
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[2].Text = ts.TotalHours.ToString("00") + ":" + ts.Minutes.ToString("00") + ":" + ts.Seconds.ToString("00");
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[3].Text = (i.目标匿名度).ToString("0.00");
                                用户列表lv.FindItemWithText(i.临时id.ToString()).SubItems[4].Text = (i.联合匿名度() / 100).ToString("0.00");
                            }
                            catch
                            {
                                用户.删除列表.Add(i);
                            }
                        }
                        用户列表lv.EndUpdate();
                    }
                }
            }
            catch { }
        }

        private void 用户列表lv_DoubleClick_1(object sender, EventArgs e)
        {
            if (用户列表lv.SelectedItems.Count == 0)
                return;
            用户 用户 = 用户.历史用户.Find(c => c.临时id.ToString() == 用户列表lv.SelectedItems[0].SubItems[1].Text);
            if (用户 != null)
            {
                用户虚拟货币窗口 f = new 用户虚拟货币窗口(用户);
                f.Show();
            }
        }
    }
}